package cz.vse.integrace.iag.google;

import com.google.gdata.data.contacts.ContactEntry;
import java.util.List;
import java.util.Map;


/**
 * Interface pro přístup ke Google kontaktům. 
 * Pro získání/vkládání/aktualizaci kontaktů může být použito uživatelské jméno
 * a heslo nebo OAuth token.
 *
 * @author David Nejedly
 * @version 1.0
 */
public interface KontaktyDAO {

    /**
     * Metoda, která načte všechny kontakty pro zadaného uživatele (jeho email)
     * buď pomocí OAuth tokenu, pokud se to nepodaří, pokusí se to načíst pomocí 
     * emailu a hesla k tomuto emailu. 
     * 
     * @param email email kontaktu pro který načítá kontakty
     * @param accessToken OAuth token pro přístup k kontaktům
     * @param heslo heslo pro přístup k kontaktům
     * @return seznam kontaktů pro zadaný email
     */
    public List<ContactEntry> getKontatky(String email,String accessToken, String heslo);
    
    /**
     * Metoda, která k zaměstnaci nastaví všechny ostatní kontakty zaměstnanců.
     * 
     * @param email email kontaktu pro který načítá kontakty
     * @param accessToken OAuth token pro přístup k kontaktům
     * @param heslo heslo pro přístup k kontaktům
     * @param kontakty kontakty k uložení
     * @param fotky fotky uživatelů
     */
    public void setKontakty(String email, String accessToken, String heslo, List<ContactEntry> kontakty, Map<String,byte[]> fotky);

    /**
     * Metoda, která načte kontakt pro zadaného uživatele (jeho email) podle jeho Id,
     * buď pomocí OAuth tokenu, pokud se to nepodaří, pokusí se to načíst pomocí 
     * emailu a hesla k tomuto emailu. 
     * 
     * @param email email kontaktu pro který načítá kontakty
     * @param accessToken OAuth token pro přístup k kontaktům
     * @param heslo heslo pro přístup k kontaktům
     * @param kontaktId id kontaktu, která má být načeten
     * @return kontakt se zadaným id, pokud není nalezen null
     */
    public ContactEntry getKontakt(String email,String accessToken, String heslo, String kontaktId);
    
    /**
     * Metoda, která načte fotografii kontaktu, který je zadán, 
     * pomocí zadaného uživatele (jeho email), buď pomocí OAuth tokenu, 
     * pokud se to nepodaří, pokusí se to načíst pomocí emailu
     * a hesla k tomuto emailu. 
     * 
     * @param email email kontaktu pro který načítá kontakty
     * @param accessToken OAuth token pro přístup k kontaktům
     * @param heslo heslo pro přístup k kontaktům
     * @param kontakt  kontakt, ke kterému má být foto načteno
     * @return data fotografie
     */
    public byte[] nactiFoto(String email, String accessToken, String heslo, ContactEntry kontakt);

    /**
     * Metoda, která uloží (pokud kontakt má edit link, tak jej aktualizuje, 
     * když ne, vytvoří nový) zadaný kontakt pomocí zadaného uživatele (jeho email),
     * buď pomocí OAuth tokenu, pokud se to nepodaří, pokusí se uložit pomocí
     * emailu a hesla k tomuto emailu. 
     * 
     * @param email email kontaktu pro který načítá kontakty
     * @param accessToken OAuth token pro přístup k kontaktům
     * @param heslo heslo pro přístup k kontaktům
     * @param kontakt kontakt, ke který má být uložen
     * @return uložený kontakt, nebo null v případě chyby
     */
    public ContactEntry ulozKontakt(ContactEntry kontakt, String emailPrace, String accessToken, String heslo);
}
